Fix fallback render nodes
authorMatthias Clasen <mclasen@redhat.com>
Thu, 4 Aug 2016 05:05:14 +0000 (01:05 -0400)
committerEmmanuele Bassi <ebassi@gnome.org>
Tue, 18 Oct 2016 10:49:11 +0000 (11:49 +0100)
We were allocating a surface thats big enough for the clip, and
we were setting the transform for that, but then GtkContainer
was overriding the transform with the one for the allocation.
Also, we were drawing at the clip position, not the allocation
position.

gtk/gtkwidget.c

index f2ae75bef073581048691eb46e99d6196e3c8e96..8946c35c20aaf3cbe645c1b3b5a9b8fee25dbdf6 100644 (file)
@@ -15849,10 +15849,12 @@ gtk_widget_get_render_node (GtkWidget   *widget,
   graphene_point3d_t tmp;
   graphene_rect_t bounds;
   GtkAllocation clip;
+  GtkAllocation alloc;
 
   gtk_widget_get_clip (widget, &clip);
+  gtk_widget_get_allocation (widget, &alloc);
   graphene_rect_init (&bounds, 0, 0, clip.width, clip.height);
-  graphene_matrix_init_translate (&m, graphene_point3d_init (&tmp, clip.x, clip.y, 0.f));
+  graphene_matrix_init_translate (&m, graphene_point3d_init (&tmp, alloc.x, alloc.y, 0.f));
 
   /* Compatibility mode: if the widget does not have a render node, we draw
    * using gtk_widget_draw() on a temporary node
@@ -15862,6 +15864,7 @@ gtk_widget_get_render_node (GtkWidget   *widget,
       GskRenderNode *tmp;
       cairo_t *cr;
       char *str;
+      graphene_point3d_t p;
 
       str = g_strconcat ("Fallback<", G_OBJECT_TYPE_NAME (widget), ">", NULL);
 
@@ -15870,6 +15873,8 @@ gtk_widget_get_render_node (GtkWidget   *widget,
       gsk_render_node_set_bounds (tmp, &bounds);
       gsk_render_node_set_transform (tmp, &m);
       cr = gsk_render_node_get_draw_context (tmp);
+      cairo_translate (cr, alloc.x - clip.x, alloc.y - clip.y);
+      gsk_render_node_set_offset (tmp, graphene_point3d_init (&p, clip.x - alloc.x, clip.y - alloc.y, 0.f));
 
       gtk_widget_draw (widget, cr);